package com.newlink.building.login.ui.fragments

import android.app.Activity
import android.content.Intent
import android.text.Editable
import android.text.TextWatcher
import android.view.View
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import com.newlink.building.login.R
import com.newlink.building.login.common.Module_Login_Constant
import com.newlink.building.login.databinding.LayoutVerifyMobileBinding
import com.newlink.building.login.event.VerifySMSCodeEvent
import com.newlink.building.login.mvp.contract.Module_Login_InputMobileContract
import com.newlink.building.login.ui.Module_Login_ForgetPwdEmailActivityNL
import com.newlink.building.common_base.base.BaseMvpFragment
import com.newlink.building.common_base.ext.showToastImmediately
import com.newlink.building.common_base.model.bean.VerifyCodeRequest
import com.newlink.building.common_base.utils.DialogUtil
import com.newlink.building.common_base.utils.countrycode.Base_CountryCodeSelectActivityNL
import com.newlink.building.login.mvp.presenter.Module_Login_InputMobilePresenter
import org.greenrobot.eventbus.EventBus

/**
 * @Author: admin
 * @Date: 2022/9/13
 * @Description: 用于用户忘记密码流程中，输入手机号码以获取验证码的界面。
 * 处理手机号输入、国家码选择以及发送短信验证码的逻辑。
 * @License: Copyright 1998 Fanvil Technology Co., Ltd. All rights reserved.
 */
class Module_Login_VerifyMobileFragment :
    BaseMvpFragment<Module_Login_InputMobileContract.View, Module_Login_InputMobileContract.Presenter>(),
    Module_Login_InputMobileContract.View {

    // 视图绑定实例
    private lateinit var binding: LayoutVerifyMobileBinding

    // 用户输入的手机号码
    private var mPhoneNumber: String? = null

    // 国家码选择 ActivityResultLauncher
    private lateinit var countryCodeLauncher: ActivityResultLauncher<Intent>

    /**
     * Companion object 用于提供 Fragment 实例。
     */
    companion object {
        /**
         * 获取 VerifyMobileFragment 的新实例。
         * @return VerifyMobileFragment 实例。
         */
        fun getInstance(): Module_Login_VerifyMobileFragment {
            return Module_Login_VerifyMobileFragment()
        }

        // 默认国家码，如果需要从外部初始化，可以考虑通过构造函数或arguments传入
        private var countryCode: String = "+86"
    }

    /**
     * 懒加载的等待对话框，确保在需要时才创建。
     * 注意：原始代码中 mDialog 没有在 hideLoading() 中被正确调用 dismiss()，
     * 并且 show() 也在 initView 中被注释，所以其生命周期管理需要特别关注。
     * 在此重构中，假设 Presenter 内部会处理 loading 状态，或者如果需要手动控制，
     * 会在 sendSMSSuccess 或 sendSMSFail (需要添加) 中调用。
     */
    private val loadingDialog by lazy {
        DialogUtil.getWaitDialog(requireContext())
    }

    /**
     * 绑定布局文件并返回根视图。
     */
    override fun attachLayoutRes(): View {
        binding = LayoutVerifyMobileBinding.inflate(layoutInflater)
        return binding.root
    }

    /**
     * 懒加载方法，当前未实现具体逻辑。
     */
    override fun lazyLoad() {
        // 无需额外的数据加载
    }

    /**
     * 创建 Presenter 实例。
     */
    override fun createPresenter(): Module_Login_InputMobileContract.Presenter = Module_Login_InputMobilePresenter()

    /**
     * 初始化视图组件和设置监听器。
     * @param view Fragment 的根视图。
     */
    override fun initView(view: View) {
        // 初始化国家码显示
        binding.tvCountryCode.text = countryCode
        binding.etPhoneNo.setBackgroundResource(R.drawable.et_underline_selector)

        setupTextWatcher()
        setupClickListeners()
        registerActivityResultLaunchers()
    }

    /**
     * 设置手机号码输入框的文本变化监听器。
     * 当输入框内容改变时，更新“获取验证码”按钮的启用状态。
     */
    private fun setupTextWatcher() {
        binding.etPhoneNo.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
            override fun afterTextChanged(s: Editable?) {
                binding.btnGetVerifyCode.isEnabled = !s.isNullOrBlank()
            }
        })
    }

    /**
     * 设置所有可点击视图的监听器。
     */
    private fun setupClickListeners() {
        // 切换到邮箱找回密码页面
        binding.tvEmailFind.setOnClickListener {
            (activity as? Module_Login_ForgetPwdEmailActivityNL)?.showFragment(Module_Login_Constant.Type.RESET_INPUT_EMAIL, "")
        }

        // 选择国家码
        binding.tvCountryCode.setOnClickListener {
            val intent = Intent(requireContext(), Base_CountryCodeSelectActivityNL::class.java)
            countryCodeLauncher.launch(intent) // 使用 Launcher 启动 Activity
        }

        // 获取验证码按钮
        binding.btnGetVerifyCode.setOnClickListener {
            handleGetVerifyCodeClick()
        }
    }

    /**
     * 注册所有的 ActivityResultLauncher。
     */
    private fun registerActivityResultLaunchers() {
        countryCodeLauncher =
            registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
                if (result.resultCode == Activity.RESULT_OK || result.resultCode == 1_000_008) { // 兼容旧的 ResultCode
                    val defaultCountryCode = result.data?.getStringExtra("default_country_code")
                    if (!defaultCountryCode.isNullOrEmpty()) {
                        binding.tvCountryCode.text = defaultCountryCode
                        countryCode = defaultCountryCode
                    }
                }
            }
    }

    /**
     * 处理“获取验证码”按钮点击事件。
     * 进行手机号格式验证并请求发送短信验证码。
     */
    private fun handleGetVerifyCodeClick() {
        val content = binding.etPhoneNo.text.toString()
        mPhoneNumber = content // 保存当前手机号码

        if (!isValidPhoneNumber(content)) {
            showToastImmediately(R.string.regex_phone_error_format)
            return
        }

        // 获取 hosting Activity 的 userCategory
        val userCategory = (activity as Module_Login_ForgetPwdEmailActivityNL).mUserCategory

        mPresenter?.sendSMS(
            VerifyCodeRequest(
                area = binding.tvCountryCode.text.toString(),
                mobile = content,
                userCategory = userCategory
            )
        )
        // 原始代码中注释了 mDialog.show()，如果需要显示加载对话框，可以在这里取消注释
        // loadingDialog.show()
    }

    /**
     * 验证手机号码格式是否符合要求。
     * 原始正则表达式 `\\d{4,}` 意为至少4位数字，可能过于宽松，
     * 在实际项目中可能需要更严格的手机号正则表达式。
     * @param number 要验证的手机号码字符串。
     * @return 如果手机号码格式正确返回 true，否则返回 false。
     */
    private fun isValidPhoneNumber(number: String): Boolean {
        val phoneMatcher = "\\d{4,}" // 至少4位数字
        return number.matches(Regex(phoneMatcher))
    }

    /*
     * 以下是 InputMobileContract.View 接口的实现方法
     */

    /**
     * 发送短信成功回调。
     * 发送 VerifySMSCodeEvent 事件，通知其他组件（如 VerifyCodeFragment）手机号码已验证。
     * @param success 是否成功发送短信。
     */
    override fun sendSMSSusscess(success: Boolean) {
        EventBus.getDefault().post(VerifySMSCodeEvent(mPhoneNumber.orEmpty()))
    }

    /**
     * 隐藏加载对话框。
     * 注意：此方法会由 BaseMvpFragment 自动调用，但如果 `loadingDialog` 是懒加载的且只在 `sendSMS` 处手动 `show()`，
     * 那么确保 `loadingDialog.dismiss()` 逻辑被正确触发。
     */
    override fun hideLoading() {
        super.hideLoading()
        // 原始代码中这里注释了 mDialog.dismiss()，如果 sendSMS 中调用了 show()，这里应该取消注释
        // loadingDialog.dismiss()
    }
}